iT邦幫忙

2022 iThome 鐵人賽

DAY 16
0

一般框架不會使用單純的 file-base 的資料庫

這樣無法做多工的任務

所以接下來我們要使用 SQL databases

記得 Rails 的 ActiveRecord 是使用 ORM 模式嗎?

mini-migration

即使今天沒有 migration ,我們仍然需要 table 來存資料

安裝 SQLite 之前,確認一下你的電腦有沒有安裝

# rainbow/rainbow.gemspec
gem.add_runtime_dependency "erubis"
gem.add_development_dependency "rack-test"
gem.add_runtime_dependency "multi_json"
gem.add_runtime_dependency "sqlite3" # <- 增加這行
> bundle install

SQLite 會在本機存資料庫,除此之外,他還會多工運作,就像真的資料庫一樣

我們來建立新的資料庫檔案及裡面的table

# best_quotes/mini_migration.rb
  require "sqlite3"
  conn = SQLite3::Database.new "test.db"
  conn.execute << SQL
  create table my_table (
    id INTEGER PRIMARY KEY,
    posted INTEGER,
    title VARCHAR(30),
    body VARCHAR(32000));
  SQL
> bundle exec ruby mini_migration.rb

mini-migration 會用 id 做一個 table

這個 table 會存在檔案中,名稱是 test.db

並且會有三個欄位,分別是 title 、 body 、 posted,前面兩個是字串型態,後面是數字型態

Rainbow 需要知道這個 table 跟 column,並且去使用他們

我們來看看 SQLite 的 schema

讀取 Schema

# rainbow/lib/rainbow/sqlite_model.rb
  require "sqlite3"
  require "rainbow/util"
  DB = SQLite3::Database.new "test.db"
  module Rainbow
    module Model
      class SQLite
        def self.table
          Rainbow.to_underscore name
        end
        
        def self.schema
          return @schema if @schema
          @schema = {}
          DB.table_info(table) do |row|
            @schema[row["name"]] = row["type"]
          end
          @schema 
        end
      end 
    end
  end

我們來確認一下 SQLite 這個 class 中有沒有 table 的名字

並且使用 table_info 這個方法來抓出 schema

@schema 是在這個 class 下的實體變數

在這個 class 以及 繼承的 class 中,只能有一個 @schema

web 小辭典
table_info: 將 table 的欄位資訊列出
schema: 紀錄資料庫的欄位、型態,以及任何 table 的異動

IRB

我們常會在 irb 中發現錯誤,可能是因為我們載入多次的函示庫

# best_quotes/sqlite_test.rb
require "sqlite3"
require "rainbow/sqlite_model"
class MyTable < Rainbow::Model::SQLite; end
STDERR.puts MyTable.schema.inspect

當這段程式碼被執行時,他會去讀 schema 然後把錯誤訊息印出來

這時我們要用 bundle 來執行 sqlite_test.rb 這個檔案

> bundle exec ruby sqlite_test.rb

如果是得到一個空 hash,確認一下有沒有做 mini- migration,沒有就現在做

或者我們可以到 irb 環境載入 Rainbow (類似 rails console) 並且在裡面試

執行下列程式碼

> bundle exec irb -r rulers

> require_relative "./ sqlite_test.rb"

假設已經有個 table 了

你會發現在 irb 環境中沒有足夠的方法讓你去使用

我們明天就來做些方法給他


上一篇
Day 15 - Rack 的 Request 及 Response
下一篇
Day 17 - ORM 環境
系列文
從0開始刻 淺談 Rails 的運作魔法30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言